home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 February / EnigmA AMIGA RUN 15 (1997)(G.R. Edizioni)(IT)[!][issue 1997-02][PLANET CD V].iso / enigma / earcd / comm / comm5 / nwsbrkr5.lha / Reader / NewsBreaker / src / Globals.h < prev    next >
C/C++ Source or Header  |  1996-12-15  |  34KB  |  1,084 lines

  1. /*
  2.  globals.h -- Globale Variablen
  3. */
  4.  
  5. /* Programmname und EMail-Adresse des Autors. Ich habe diese Namen über
  6. Defines eingebaut, damit man schnell die Soft für andere Projekte
  7. leichter recyclen kann. Der Name und andere Daten sind schnell und problemlos
  8. ausgetauscht. */
  9.  
  10. #define NB_NAME         "NewsBreaker"
  11. #define NB_AUTHOR_NAME  "Stefan Müller"
  12. #define NB_AUTHOR_EMAIL "sm@mk2.maus.sauerland.de"
  13.  
  14. /* von ARexx Script erzeugte Defines:
  15.  NB_DATE       -- aktuelles Compile-Datum
  16.  NB_TIME       -- aktuelle Zeit
  17. */
  18. #include <Define.h>
  19.  
  20. /*
  21.  Version besteht aus: Release/Revision/Compilerlauf
  22.  
  23.  NB_REL        -- Release x, die "Auflage" der Applikation
  24.  NB_REV        -- die x.te Revision (Überarbeitung) einer Release
  25.  NB_COMP       -- der x. Compilerlauf in einer Release (Compilerscript: >>Define.h)
  26.  NB_STATUS     -- Entwicklungsstatus: alpha/beta/gamma/final ...
  27. */
  28.  
  29. #define NB_REL  "0"
  30. #define NB_REV  "5"
  31. /* NB_COMP wird durch Compilerscript hochgezählt, erzeugt, eingebunden */
  32. #define NB_STATUS  "alpha"
  33.  
  34. /* Versions-Nummer im üblichen Amiga-Format, z.B. "3.1" */
  35. #define NB_VER        NB_REL  "."  NB_REV
  36.  
  37. /* Standard Amiga Version-Schablone (ala full Version-String)*/
  38. #define NB_VERSION    NB_NAME  " "  NB_VER  " ("  NB_DATE  ")"
  39.  
  40. /* Version-Schablone, zusätzlich mit Autor-Email-Adresse */
  41. /* für: About-Text, "Newsreader:"-Tag */
  42. #define NB_TAG          NB_VERSION  " <"  NB_AUTHOR_EMAIL  ">"
  43.  
  44. /* Zusammenfassung aller Version- und Zeitinfos: */
  45. #define ALPHA_WARNING   "Version: "  NB_NAME  " "  NB_VER    \
  46.             " (" NB_COMP ". Compilerlauf).\n" \
  47.             NB_DATE  " "  NB_TIME \
  48.                         " Status: "  NB_STATUS  "\n"
  49.  
  50.  
  51. /*-----------------------------------
  52.  Library-Base-Pointer
  53.  ------------------------------------ */
  54.  
  55. /* Basisadressen der Amiga runtime link libraries */
  56.  
  57. struct Library *IntuitionBase = NULL;
  58. struct Library *GfxBase = NULL;
  59. struct Library *GadToolsBase = NULL;
  60. struct Library *UtilityBase = NULL;
  61. struct Library *IFFParseBase = NULL;    /* zur Zeit nur für Textfield-Clipboards */
  62. struct Library *UMSBase = NULL;
  63. struct Library *DataTypesBase = NULL;
  64. struct Library *DiskFontBase = NULL;
  65. struct Library *UMSSupportBase = NULL;
  66. struct Library *gLib = NULL;    /* C='s G1 BOOPSI Buttongadget */
  67. struct Library *TextLabelBase =NULL;
  68. struct Library *ItemListBase = NULL;    /* Tim's BOOPSI ListView */
  69. struct Library *CompListViewBase = NULL;
  70.  
  71. /*--------------------------------------------------------------
  72.                            Globale Variablen
  73.   --------------------------------------------------------------*/
  74.  
  75.  
  76. // TODO: Werte für Focus -- wird entfallen und durch Filterstring ersetzt
  77. // TODO1: Benutzung v. umssupport.lib
  78. #define AlleMsg 1
  79. #define NeueMsg 2
  80. #define Letzte25Msg 25
  81. LONG GlobalFocus = NeueMsg;    /* Hack, todo: besseres System */
  82.  
  83. /*--------------------------------------------------*/
  84. /* Versiontag */
  85.  
  86. static const char vers[] = "\0$VER: " NB_VERSION;
  87.  
  88.  
  89. /**********************************************************************
  90.  *                            Textfield-Gadget                        *
  91.  **********************************************************************/
  92.  
  93. /*
  94.    Hinweis: Hat nichts mit den UMS-Message-Textfields zu tun! Textfield
  95.    ist hier ein BOOPSI-Gadget für mehrzeilige Texteingabe und -darstellung.
  96.  */
  97.  
  98. /* Zeiger auf verschiedene dynamisch allozierte Buffer, todo: entfernen */
  99. static unsigned char *text_buffer, *my_buffer;
  100.  
  101. /* Pixel-Abstand des Textfield links-rechts (_w) und oben-unten (_h), todo */
  102.  
  103. struct IBox gap = { 5,5,5,5 }; /* Dummy */
  104. struct IBox box_group =   { 5,5,5,5 }; /* Dummy */
  105. struct IBox box_message = { 5,5,5,5 }; /* Dummy */
  106.  
  107. WORD box_h = 80;
  108. static WORD gap_w, gap_h; /* wird obsolet */
  109.  
  110. /* Pixel-Höhe der Infozeile (Daten einer selektierten Message), Kludge. */
  111. struct IBox infobar = { 0,0,0,0 };
  112. static WORD infobar_h;  /* wird obsolet */
  113.  
  114. /* Zwischenablage (Clipboard) Schnittstellen für das Textfield-Gadget */
  115. static struct ClipboardHandle *clip_handle, *undo_handle;
  116.  
  117.  
  118. /* Text für Programstart */
  119.  
  120. static char initial_text[] =
  121.  
  122. ALPHA_WARNING
  123. "\n"
  124. NB_NAME
  125. " - Der phantastische UMS-Newsreader. "
  126. "Autor: " NB_AUTHOR_NAME "  <" NB_AUTHOR_EMAIL ">.\n"
  127. "Updates:\n MAUS MK2 Mailbox\n 02371/944925 \n Gruppenprogrammteil MT.UMS\n";
  128.  
  129. static char help_text[] =
  130.  
  131. "Kurz-Anleitung:\n"
  132. "-----------------------------------------------------------\n\n"
  133. NB_NAME " -- ein Newsreader für das UMS-System.\n\n"
  134. "\n\n"
  135. "Menü-Referenz (alt)\n"
  136. "-----------------------------------------------------------\n"
  137. "Projekt\n"
  138. " ···························\n"
  139. "                       Allgemeines\n"
  140. "\n"
  141. "Über NewsBreaker... -- kurze Info über das Programm\n"
  142. "Hilfe...            -- Online-Hilfe, Tips und Lösungen\n"
  143. "Ende                -- NewsBreaker beenden\n"
  144. "\n"
  145. "\n"
  146. "Text\n"
  147. " ···························\n"
  148. "                       Textbearbeitung\n"
  149. "\n"
  150. "Ausschneiden        -- Textblock in Zwischenablage verschieben\n"
  151. "Kopieren            -- Textblock in Zwischenablage kopieren\n"
  152. "Alles kopieren      -- kompletten Text in Zwischenablage kopieren\n"
  153. "Einfügen            -- Inhalt der Zwischenablage einfügen\n"
  154. "Wiederherstellen    -- gelöschten Text zurückholen\n"
  155. "Löschen             -- Text im Eingabefeld löschen\n"
  156. "\n"
  157. "\n"
  158. "Nachrichten\n"
  159. " ···························\n"
  160. "                       Lesen & Navigieren\n"
  161. "\n"
  162. "Gruppe wählen...    -- Gruppe wählen\n"
  163. "Nachricht wählen... -- Nachricht zum Lesen wählen\n"
  164. "Nächste Nachricht   -- zur nächsten Nachricht blättern\n"
  165. "Vorherige Nachricht -- zur letzten Nachricht zurückblättern\n"
  166. "eMails wählen       -- eMails zum Lesen wählen\n"
  167. "\n"
  168. "\n"
  169. "Schreiben      \n"
  170. " ···························\n"
  171. "                       Texte verfassen und verschicken \n"
  172. "\n"
  173. "Reply               -- private Antwort auf eine Nachricht\n"
  174. "FollowUp            -- öffentliche Antwort in einer Gruppe\n"
  175. "EMail               -- privates Schreiben an einen User\n"
  176. "Posting             -- öffentlicher Artikel für eine Gruppe\n"
  177. "\n"
  178. "\n"
  179. "Einschränkungen\n"
  180. " ···························\n"
  181. "                       Filterfunktionen\n"
  182. "\n"
  183. "Alle Nachrichten    -- alle vorhandenen Nachrichten anzeigen\n"
  184. "Nur die 25 jüngsten\n"
  185. "        Nachrichten -- bis zu 25 Nachrichten einer Gruppe anzeigen\n"
  186. "Nur neue Nachrichten-- nur noch nicht gelesene Nachrichten anzeigen\n"
  187. "\n"
  188. "Debug-Tools: na was wohl? :-)\n";
  189.  
  190.  
  191.  
  192. static char bugs_text[] =
  193. "BUGS in " NB_TAG "\n\n"
  194. "-----------------------------------------------------\n"
  195. "Listen: instabil bei Einlesen großer Newsgruppen\n"
  196. "Fenster: Refresh kann crashen.\n"
  197. "-- \n"
  198. "Fehlerberichte bitte an " NB_AUTHOR_EMAIL "\n"
  199. "mit Angabe Version, benutzter Amiga-Hard/Software.\n";
  200.  
  201. static char bugreport_text[] =
  202. ";----  FEHLERBERICHT / BUG REPORT  zu  NEWSBREAKER ----- \n"
  203. ";WICHTIGE FRAGEN ZU DEINEM SYSTEM\n"
  204. ";\n"
  205. ";    Amiga-Typ:   A.... mit AmigaOS 3.1 oder: Emuliert auf PC mit ...\n"
  206. ";   Welche CPU:   680..\n"
  207. ";Welche Extras:   Turbokarte / SCSI / CD-ROM / Grafikkarte /...\n"
  208. ";Speicher Fast:   ... MB \n"
  209. ";Speicher Chip:   ... MB \n"
  210. "  avail full\n"
  211. ";\n"
  212. ";Benutzt Du Commodities und besondere Systemerweiterungen, Patches,\n"
  213. ";Libraries, Devices, Filesysteme?\n"
  214. "   c:list SYS:wbstartup LIBS: DEVS: L:\n"
  215. "\n"
  216. ";FRAGEN ZU DEINER UMS-INSTALLATION\n\n"
  217. ";Versionsnummern\n"
  218. "  version UMS:Libs/ums.library\n"
  219. "  version UMS:Libs/umsserver\n"
  220. ";\n"
  221. ";Installierte Messagebase(s)\n"
  222. "  c:list >t:out ENV:UMSMB.#? lformat=\"echo %n*ngetenv %n\"\n"
  223. "  c:execute t:out\n"
  224. ";\n"
  225. ";UMS-Konfiguration(en)\n"
  226. ";\n"
  227. ";FEHLERBESCHREIBUNG Nr. 1\n"
  228. ";Diese Schritte führten bei mir zum Fehler: \n"
  229. ";1. \n"
  230. ";2. \n"
  231. ";3. \n"
  232. ";Ergebnis: Crash/Fehlermeldung/Falsche Reaktion/...\n"
  233. ";\n\n"
  234. ";FEHLERBESCHREIBUNG Nr. ..\n"
  235. ";1. \n"
  236. ";2. \n"
  237. ";3. \n"
  238. ";Ergebnis: Crash/Fehlermeldung/Falsche Reaktion/...\n"
  239. ";\n\n";
  240.  
  241. static char orderform_text[] =
  242. "BESTELLSCHEIN für " NB_NAME "\n"
  243. "\n"
  244. "An:\n "
  245. NB_AUTHOR_NAME "\n"
  246. NB_AUTHOR_EMAIL "\n\n"
  247. "\n"
  248. "Bitte schick mir die neueste " NB_NAME " Version\n"
  249. "- mit gedruckter Anleitung\n"
  250. "- per Post, frei Haus.\n"
  251. "\n"
  252. "Meine Lieferadresse:\n\n"
  253. "(NAME, STRASSE, PLZ,WOHNORT, LAND)\n"
  254. "\n\n"
  255. "\n\n\n\n"
  256. "Versandtermin: (__) umgehend   (__) erst ab .../.../19..(Datum)\n"
  257. "\n"
  258. "Für den Versand habe ich \n"
  259. "- diesem Brief DM ___ gut verpackt beigelegt\n"
  260. "  oder\n"
  261. "- auf das Konto Nr. 9 522 152 bei der Sparkasse Schwerte,\n"
  262. "  Bankleitzahl 441 524 90, Inhaber: " NB_AUTHOR_NAME " am \n"
  263. "  .../.../19.. (Datum) den Betrag von DM ___ überwiesen.\n"
  264. "\n"
  265. "Meine E-Mail-Adresse: \n"
  266. "\n"
  267. "Bemerkungen/Versandhinweise:\n"
  268. "\n\n";
  269.  
  270. static char featurewish_text[] =
  271. "WUNSCHZETTEL für " NB_NAME "ERWEITERUNGEN\n"
  272. "\n"
  273. "An:\n "
  274. NB_AUTHOR_NAME "\n"
  275. NB_AUTHOR_EMAIL "\n\n"
  276. "Hallo,\n\n"
  277. "ich benutze " NB_VERSION ".\n\n"
  278. "Diese Erweiterungen wünsche ich mir für die nächste \n"
  279. "Version:\n\n"
  280. "1. -- \n"
  281. "2. --\n"
  282. "3. --\n"
  283. ".. \n"
  284. "Hier meine E-Mail-Adresse für Rückfragen:\n\n"
  285. "\nErgänzungen/Bemerkungen:\n"
  286. "\n\n";
  287.  
  288.  
  289. /*-----------------------------------------------------------
  290.                           BOOPSI Listview
  291.   -----------------------------------------------------------*/
  292.  
  293. /*
  294.    LISTVIEWS:
  295.    Variabeln für das BOOPSI ListView von Tim Stack. Visit his Website!
  296.    Er hat ca. 20 BOOPSI Objekte online, als Exe und komplett mit Source.
  297.  
  298.    WWW: (Stand November 1996)
  299.    ----
  300.    http://www.cs.utah.edu/~stack/boopsi.html
  301.  
  302.    Tims BOOPSI-Hauptseite mit Links auf:
  303.  
  304.    -  http://www.cs.utah.edu/~stack/classsrc.lha
  305.    Sehr großes (> 1.000 K!) Archiv mit allen Classes und Sourcen
  306.    Aktuelle Dateien sind nicht im Archiv, sondern in dem Classes/ dir.
  307.  
  308.    -  http://www.cs.utah.edu/~stack/makealias.iff
  309.    ein Hilfsprogramm.
  310.  
  311.    -  http://www.cs.utah.edu/~stack/classes
  312.    Oberdirectory von Tims Sourcen
  313.    (wie in <classsrc.lha>, hier können gezielt Einzelfiles geladen werden)
  314.    - Classes/itemlist/demo.c  ---- idcmp loop demo
  315.  
  316.    Frage: wie kommt man an das Verzeichnis einer Web-URL???
  317.  
  318.    AMINET: (Stand November 1996)
  319.    -------
  320.    ListViewClass.lha  dev/gui     60K   1+BOOPSI listview gadget with source
  321.    -- das ist eine ältere Version (August 1996) von Tims ListView Gadget und
  322.       ListViewItems
  323.  
  324.    EMAIL: (Stand November 1996)
  325.    ------
  326.    Tim Stack <stack@eng.utah.edu>
  327.  */
  328.  
  329. /* Drei Listviews, ein Gruppen-, ein "Thread-", ein Nachrichten-ListView. */
  330.  
  331.  
  332. /* Gadget IDs */
  333. #define LV_GROUP 20
  334. #define LV_MESSAGE 40
  335. #define LV_THREAD 60
  336.  
  337. struct Gadget *gad_group, *gad_message, *gad_thread;    /* BOOPSI Object Pointer */
  338. //struct Gadget *prop_group, *prop_message;    /* Scroller Gadget */
  339.  
  340. /**********************************************************************
  341.  *                             Intuition                              *
  342.  **********************************************************************/
  343.  
  344. struct Window *Mywindow = NULL;
  345. struct Gadget *txtfld, *prop_object, *up_object, *down_object;
  346. struct Image *up_image, *down_image;
  347.  
  348. /* Hauptfenster */
  349. ULONG window_sig, sigs;  /* Exec Signale */
  350.  
  351. struct IntuiMessage *msg;    /* Zeigt auf IMessage, verwendet in Mainloop */
  352. struct IntuiMessage myMsg;    /* gepufferte Felder aus msg */
  353.  
  354. struct DrawInfo *dri = NULL;    /* Struktur für einheitliche Layouts */
  355. UWORD *pens;             /* Pen-Array (aus DrawInfo) */
  356. APTR *visual_info = NULL;    /* Hilfsstruktur für Gadtools-Gadgets */
  357.  
  358. struct Menu *strip;        /* Menustruktur, wird über Gadtools-Supportfunktion erzeugt */
  359.  
  360.  
  361. /*------------------- Puffer -------------------------------- */
  362.  
  363. static char myWindowTitle[101] = "";
  364. #define MYBUFFERSIZE 255
  365. static char myBuffer[MYBUFFERSIZE] = "";    /* ein globaler Stringpuffer */
  366.  
  367. /*------------------------- BOOPSI -------------------------- */
  368.  
  369. /* Textfield BOOPSI-Mapping von Attributen */
  370.  
  371. /* Prop-Gadget */
  372. static struct TagItem prop2text[] =
  373. {
  374.   {PGA_Top, TEXTFIELD_Top},
  375.   {TAG_DONE}
  376. };
  377.  
  378. /* Textfield-Gadget */
  379. static struct TagItem text2prop[] =
  380. {
  381.   {TEXTFIELD_Top, PGA_Top},
  382.   {TEXTFIELD_Visible, PGA_Visible},
  383.   {TEXTFIELD_Lines, PGA_Total},
  384.   {TAG_DONE}
  385. };
  386.  
  387. /* Up-Button */
  388. static struct TagItem up2text[] =
  389. {
  390.   {GA_ID, TEXTFIELD_Up},
  391.   {TAG_DONE}
  392. };
  393.  
  394. /* Down-Button */
  395. static struct TagItem down2text[] =
  396. {
  397.   {GA_ID, TEXTFIELD_Down},
  398.   {TAG_DONE}
  399. };
  400.  
  401. /*-------------------- BOOPSI Listview --------------------*/
  402.  
  403. struct ItDim        /* Item Abmessungen */
  404.   {
  405.     WORD Width;
  406.     WORD Height;
  407.   };
  408.  
  409. struct ItOff        /* Item Offset */
  410.   {
  411.     WORD X;
  412.     WORD Y;
  413.   };
  414.  
  415. struct TagItem il2int1[] =
  416. {
  417.   {ILGA_Top, STRINGA_LongVal},
  418.   {TAG_DONE,}
  419. };
  420.  
  421. struct TagItem il2int2[] =
  422. {
  423.   {ILGA_Selected, STRINGA_LongVal},
  424.   {TAG_DONE,}
  425. };
  426.  
  427. struct TagItem il2prop[] =
  428. {
  429.   {ILGA_Top, PGA_Top},
  430.   {ILGA_Total, PGA_Total},
  431.   {ILGA_Visible, PGA_Visible},
  432.   {TAG_DONE,}
  433. };
  434.  
  435. struct TagItem ic12prop[] =
  436. {
  437.   {ILGA_Selected, PGA_Top},
  438.   {ILGA_Total, PGA_Total},
  439.   {TAG_DONE,}
  440. };
  441.  
  442. struct TagItem ic22prop2[] =
  443. {
  444.   {ILGA_Top, PGA_Top},
  445.   {ILGA_Visible, PGA_Visible},
  446.   {ILGA_Total, PGA_Total},
  447.   {TAG_DONE,}
  448. };
  449.  
  450. struct TagItem prop2il[] =
  451. {
  452.   {PGA_Top, ILGA_Selected},
  453.   {TAG_DONE,}
  454. };
  455.  
  456. struct TagItem prop22il[] =
  457. {
  458.   {PGA_Top, ILGA_Top},
  459.   {TAG_DONE,}
  460. };
  461.  
  462. struct TagItem ic12il[] =
  463. {
  464.   {PGA_Top, ILGA_Selected},
  465.   {TAG_DONE,}
  466. };
  467.  
  468. struct TagItem ic22il[] =
  469. {
  470.   {PGA_Top, ILGA_Top},
  471.   {TAG_DONE,}
  472. };
  473.  
  474.  
  475. /*************************************************************************
  476.  *                               UMS                                     *
  477.  *************************************************************************/
  478.  
  479. /* Zeiger auf Commandline-Argumente */
  480. /*
  481.  * Für ein erfolgreiches LOGIN benötigt UMS:
  482.  *
  483.  * ---muß---
  484.  * user --   UMS-Username, z.B. "Stefan Müller", "sysop", ...
  485.  * passwd -- Paßwort, z.B. "sesam", (oder "%", für "kein Paßwort")
  486.  *
  487.  * ---kann---
  488.  * server -- UMS-Server, wird meist nicht angegeben. "default" für
  489.  *           den Standardserver, "<andererServer>" für einen Fremdserver.
  490.  *           Ein in der Regel bei Einplatz-System unbenutztes UMS-Feature.
  491.  *           Forget it.
  492.  *
  493.  * Selbstverständlich muß der User & sein Paßwort bereits für
  494.  * UMS konfiguriert sein. Das sieht in der Regel so aus:
  495.  *
  496.  
  497.  <ums.config>
  498.  ( Sysop       --- ich bin Sysop-"User"
  499.  ( Alias   --- man kennt mich auch als: root, postmaster, ...
  500.  root
  501.  postmaster
  502.  sysop
  503.  Stefan
  504.  "Stefan Mueller"
  505.  "Stefan_Müller"
  506.  )
  507.  ( READACCESS "#?" ) --- ich kann alle Gruppen lesen
  508.  ( WRITEACCESS "#?" ) --- ich kann in alle Gruppen schreiben
  509.  ( NETACCESS "#?" ) --- ich habe uneingeschränkten Netzzugang
  510.  ( IMPORT % ) --- ich kann nichts importieren (das macht der Importer)
  511.  ( Name "Stefan Müller" ) --- mein persönlicher Name (realname)
  512.  ( Password  ) --- mein Paßwort. Da ich keins habe: kein Eintrag.
  513.  )
  514.  
  515.  *
  516.  * Fehlt der Usereintrag, oder gibt es Fehler beim Login, bricht
  517.  * NewsBreaker sofort ab. (todo: Abbruch erst bei Cancel)
  518.  *
  519.  */
  520.  
  521. STRPTR user = NULL;        /* UMS-Username */
  522. STRPTR passwd = NULL;        /* geheimes Paßwort */
  523. STRPTR server = NULL;        /* (optionaler) UMS-Server */
  524.  
  525. /* Account, globaler Handle für alle UMS-Funktionen */
  526. /* wird nach erfolgreichem Login gesetzt, und nach Logout
  527.  * werden alle UMS-Puffer für den account freigegeben.
  528.  */
  529. UMSUserAccount account = NULL;    /* globaler Handle */
  530.  
  531. /* ===================================================
  532.  * MessageInfo
  533.  * ===================================================
  534.  *
  535.  * Was ist MessageInfo?
  536.  * --------------------
  537.  * Eine wichtige Struktur in <ums.h>:
  538.  *
  539.  * struct MessageInfo {
  540.  *                  LONG      msgi_HeaderLength;
  541.  *                  LONG      msgi_TextLength;
  542.  *                  LONG      msgi_Date;
  543.  *                  UMSMsgNum msgi_ChainUp;
  544.  *                  UMSMsgNum msgi_ChainDn;
  545.  *                  UMSMsgNum msgi_ChainLt;
  546.  *                  UMSMsgNum msgi_ChainRt;
  547.  *                  UMSSet    msgi_GlobalStatus;
  548.  *                  UMSSet    msgi_UserStatus;
  549.  *                  UMSSet    msgi_LoginStatus;
  550.  *                  UMSMsgNum msgi_HardLink;
  551.  *                  UMSMsgNum msgi_SoftLink;
  552.  *  [V11 extension, only filled by UMSTAG_RExtMsgInfo:]
  553.  *                  LONG      msgi_CDate;
  554.  *                  LONG      msgi_Reserved[3];
  555.  *                 };
  556.  *
  557.  * MessageInfo kann für jede Message mit UMSReadMsg ausgefüllt
  558.  * werden. Vorteile: ein Aufruf von UMSReadMsg(), ein Platz für
  559.  * die Struktur reicht, um alle wichtigen Daten der Message ab-
  560.  * zulegen, auszulesen.
  561.  *
  562.  * Was liefert MessageInfo nicht?
  563.  * ------------------------------
  564.  * MessageInfo liefert keine Zeiger auf Texte, Adressen,
  565.  * Titel usw.
  566.  *
  567.  * Dafür gibt es UMSMsgTextFields[UMSNUMFIELDS].
  568.  * Siehe <ums.h> für die Definition der einzelnen Feld-Indices.
  569.  *
  570.  *                      [                ]
  571.  *
  572.  *               #define UMSCODE_MsgText         0
  573.  *               #define UMSCODE_FromName        1
  574.  *               #define UMSCODE_FromAddr        2
  575.  *               #define UMSCODE_ToName          3
  576.  *               #define UMSCODE_ToAddr          4
  577.  *               ...
  578.  *
  579.  *
  580.  *       printf ( "FromName: %s",  myTextFields [ UMSCODE_FromName ]   );
  581.  *
  582.  *       ergibt:
  583.  *
  584.  *       FromName: Hans Hase
  585.  *
  586.  * wenn vorab ein
  587.  *      UMSMsgTextFields myTextFields
  588.  * mit
  589.  *      UMSReadMsg() erfolgreich ausgefüllt wurde:
  590.  *
  591.  * immer testen, ob Lesen erfolgreich war:
  592.  *
  593.  *      if (!UMSReadMsg(account,tags,...)) { Fehler!} else { OK! }
  594.  *
  595.  * Mehr über die MessageInfo-Struktur
  596.  * ----------------------------------
  597.  * Alle Werte in der Struktur sind für genau eine Nachricht
  598.  * gültig. Für jede Message müssen die Werte neu eingelesen werden.
  599.  *
  600.  * Wichtig:
  601.  * Die tatsächlichen Werte einer Message können sich jederzeit
  602.  * ändern. Angaben in MessageInfo sind nicht ewig gültig. Nur
  603.  * im Abruf-Zeitpunkt ist das einigermaßen sicher. Denn:
  604.  *
  605.  * Parallel laufende externe UMS-Programme (Exporter, Importer,
  606.  * Laberfilter, Newsreader) können leicht Daten einer Message abändern.
  607.  * Die historischen Angaben in MessageInfo sind dann veraltet.
  608.  * Aktuelle Werte der Message erfährt man nicht aus alten MessageInfos.
  609.  * Don't trust MessageInfo!
  610.  *
  611.  *
  612.  * Wie kommen UMS-Daten in MessageInfo?
  613.  * ------------------------------------
  614.  *
  615.  * Mit
  616.  *                                                 [ungetestet]
  617.  * {
  618.  * UMSMsgNum MessageNummer
  619.  * struct MessageInfo MInfo,
  620.  *
  621.  * success = UMSReadMsgTags(account,
  622.  *                UMSTAG_RMsgInfo, (ULONG) &MInfo,
  623.  *                UMSTAG_RMsgNum,  MessageNummer,
  624.  *                TAG_DONE
  625.  *                );
  626.  *
  627.  *
  628.  *
  629.  * Welche Daten sind in MessageInfo verfügbar?
  630.  * -------------------------------------------
  631.  * - HeaderLength, TextLength, Date, ChainUp, ChainDn,
  632.  *   ChainLt, ChainRt, GlobalStatus, UserStatus, LoginStatus, HardLink,
  633.  *   SoftLink.
  634.  * - Unter UMS V11 zusätzlich  CDate. Ein spezieller Tag muß beim
  635.  *   Einlesen gesetzt werden.
  636.  *   (siehe unten)
  637.  * - Darüber hinaus gibt es spezielle Daten. Nur mit UMSReadMsg() abrufbar.
  638.  *   Siehe <ums.h>.
  639.  *
  640.  * Wann ist MessageInfo zu umständlich?
  641.  * ------------------------------------
  642.  * Wer nur wenige Daten aus dieser Liste braucht, ist mit
  643.  *
  644.  *     LONG Info;
  645.  *     success = UMSReadMsgTags(account, UMSTAG_R......., &Info);
  646.  *
  647.  * besser bedient. Der Overhead einer kompletten MessageInfo-Struktur
  648.  * wird vermieden. Es wird nur Platz für die benötigten Felder
  649.  * vergeben. Wenn z.B. NUR globale Flags gelesen werden, reicht
  650.  * ein UMSSet myGlobalFlags, ein ReadMsg() mit entsprechendem
  651.  * Tag und & myGlobalFlags. Dann wird myGlobalFlags mit der passenden
  652.  * Info für Message Nummer x gefüllt. Auch hier wieder: Testen
  653.  * auf Fehler bei ReadMsg.
  654.  *
  655.  * Beispiel [ungetestet]
  656.  *
  657.  * Aufgabe: Gegeben ist die MsgNum 10. Ermittle die
  658.  *          übergeordnete Nachricht von Msg 10.
  659.  *
  660.  *       vorab: ums.lib öffnen, einloggen mit account = UMSRLogin()
  661.  *       {
  662.  *       UMSMsgNum  MeineMessage = 10;
  663.  *       UMSMsgNum  Ursprungsnachricht = NULL;
  664.  *
  665.  *       if (! UMSReadMsgTags(account,
  666.  *                      UMSTAG_RMsgNum,  (LONG) MeineMessage,
  667.  *                      UMSTAG_RChainUp, (LONG) &Ursprungsnachricht,
  668.  *                      TAG_DONE)
  669.  *           ) printf("FEHLER bei ReadMsg()")
  670.  *        else
  671.  *       {
  672.  *       if (Ursprungsnachricht)
  673.  *          printf ("Ursprungsnachricht meiner Message %ld ist Message %ld\n",
  674.  *                  MeineMessage, Ursprungsnachricht);
  675.  *       else
  676.  *          printf ("Eine übergeordnete Nachricht zu %ld wurde nicht gefunden!\n",
  677.  *                  MeineMessage);
  678.  *        }
  679.  *      }
  680.  *      ausloggen,
  681.  *      ums.library schließen
  682.  *
  683.  * Beispiel Ende.
  684.  *
  685.  *
  686.  * Erweiterungen in V 11?
  687.  * -----------------------
  688.  * Unter UMS Version 11 gibts mit UMSTAG_RExtMsgInfo
  689.  * das Feld "msgi_CDate" sowie drei reservierte Langworte als
  690.  * LONG msgi_Reserved[3];
  691.  *
  692.  *       UMSReadMsgTags(account,
  693.  *                      UMSTAG_RMsgNum,      (LONG)   MeineMessage,
  694.  *                      UMSTAG_RExtMsgInfo,           TRUE,
  695.  *                      UMSTAG_RMsgInfo,     (LONG *) myMessageInfo,
  696.  *                      TAG_DONE);
  697.  *
  698.  *
  699.  * MESSAGE INFO - FELDER IM DETAIL
  700.  * ===============================
  701.  * Feldinhalte und mögliche Werte aufgelistet und beschrieben.
  702.  *
  703.  * Wie lang ist der Text?
  704.  * ----------------------
  705.  * LONG        HeaderLength  -- Länge des Message-Headers in bytes
  706.  * LONG        TextLength    -- Länge des Message-Textes in bytes
  707.  *
  708.  * Wie alt ist die Nachricht?
  709.  * --------------------------
  710.  * LONG        Date          -- (obsolet) Datum der Message:
  711.  * LONG        CDate         -- nur mit UMS V11 und Extension-Tag
  712.  *
  713.  * Verknüpfungen zu anderen Nachrichten?
  714.  * -------------------------------------
  715.  * UMSMsgNum   ChainUp       -- Ursprungsnachricht
  716.  * UMSMsgNum   ChainDn       -- gibt es "unter mir" angehängte Nachrichten?
  717.  * UMSMsgNum   ChainLt       -- weitere Nachrichten, die sich auch auf
  718.  * UMSMsgNum   ChainRt       --  die Ursprungsnachricht beziehen
  719.  *
  720.  *
  721.  * Die Stati dieser Nachricht
  722.  * --------------------------
  723.  * Hinweis:
  724.  * 1. Der Typ UMSSet ist vom Typ LONGBITS. Das sind 32 Bits. Unter UMS
  725.  * stehen dem Programmierer _nur die 16 unteren Bits_ zur Verfügung.
  726.  * Die 16 oberen Bits (Bit 16 bis 31) sind zur Zeit tabu.
  727.  *
  728.  * 2. Es gibt drei Gruppen von Statusangaben. Es ist wichtig,
  729.  * den richtigen Status zum Schreiben und zum Lesen auszuwählen!
  730.  *
  731.  * a) GlobalStatus        - nur einen GlobalStatus für jede Message
  732.  * b) UserStatus          - pro User und Message: ein UserStatus
  733.  * c) Login/LocalStatus   - pro Login, User und Message: ein LoginStatus
  734.  *
  735.  * Beispiele:
  736.  * Messagebase mit 10 Messages, zwei Usern, fünf UMS-Programmen.
  737.  *
  738.  * MB  Msg#          1  2  3  4  5  6  7  8  9 10
  739.  * a) GlobalStatus   g  g  g  g  g  g  g  g  g  g   UMS-Messagebase-Processor
  740.  * b) UserStatus1    u  u  u  u  u  u  u  u  u  u   User 1
  741.  *    UserStatus2    v  v  v  v  v  v  v  v  v  v   User 2
  742.  * c) Login User1    l  l  l  l  l  l  l  l  l  l   IntuiNews User1
  743.  *    Login User1    l  l  l  l  l  l  l  l  l  l   Sumsset User1
  744.  *    Login User2    l  l  l  l  l  l  l  l  l  l   NewsBreaker User2
  745.  *    Login User2    l  l  l  l  l  l  l  l  l  l   IntuiNews User2
  746.  *    Login User2    l  l  l  l  l  l  l  l  l  l   TopTen User2
  747.  *
  748.  * In diesem Beispiel hat eine Message einen GlobalStatus (+1),
  749.  * zwei UserStatus (+2 = 3), fünf LoginStatus (+5 = 8).
  750.  *
  751.  * Zu den Status-Flags
  752.  * ===================
  753.  *
  754.  * UMSSet      GlobalStatus  -- Deleted Expired Exported Orphan Link HardLink
  755.  *                              Parked HasFile und (Protected)
  756.  * --------------------------------------------------------------------------
  757.  * HINWEIS: VIELE FLAGS SIND "PRIVATE". Siehe Protected in ums.h.
  758.  *
  759.  * Deleted - als Gelöscht markiert.
  760.  * Expired - zum Löschen freigegeben beim nächsten Aufräumen der Messagebase
  761.  *           mit UMSServerControl()
  762.  * Exported - die Nachricht wurde von einem UMS-Exporter erfolgreich versandt.
  763.  * Orphan -  Exportieren ist fehlgeschlagen?
  764.  * Link - ?  Soft-Verknüpfung für Crosspostings?
  765.  * HardLink - Verknüpfung für Crosspostings??
  766.  * Parked - der User will die Nachricht erst später versenden. Bis dahin
  767.  *          ist die Nachricht geparkt. Exportieren nicht erlaubt.
  768.  * HasFile - zu der Nachricht gehört eine Datei. Der Dateiname ist mit
  769.  *         UMSCODE_FileName aus einem UMSMsgTextFields[] zu ermitteln,
  770.  *         oder alternativ mit Tag UMSTAG_RFileName in einem UMSReadMsgTags()
  771.  *         Aufruf.
  772.  *
  773.  *
  774.  *
  775.  * UMSSet      UserStatus    -- Archive Junk PostPoned Selected Filtered Old
  776.  *                              WriteAccess ReadAccess ViewAccess Owner
  777.  *                              und (Protected)
  778.  * --------------------------------------------------------------------------
  779.  *
  780.  * Archive   - die Nachricht soll etwas länger in der Messagebase bleiben
  781.  * Junk      - auf Deutsch Müll. Unter ums: ???
  782.  * PostPoned - ?
  783.  * Selected  - die Nachricht wurde "ausgewählt", z.B. von einem Filtertool.
  784.  *             Newsreader können Selected-Nachrichten gezielt darstellen.(?)
  785.  * Filtered  - die Nachricht wurde "gefiltert", z.B. von einem Filtertool.
  786.  *             Newsreader können Selected-Nachrichten gezielt verbergen.(?)
  787.  * Old       - der User kennt diese Nachricht schon, sie ist "alt".
  788.  *             Ist Old nicht gesetzt, dann ist die Nachricht "neu".
  789.  *
  790.  *             - Verschiedene Zugriffsrechte Deines UMSAccounts. Abhängig
  791.  *              von der UMS-Konfiguration für den User:
  792.  * WriteAccess - ich darf diese Nachricht überSchreiben
  793.  * ReadAccess  - ich darf diese Nachricht und ihre Header lesen
  794.  * ViewAccess  - ich kann diese Nachricht "sehen" (sie ist nicht "versteckt")
  795.  * Owner       - diese Message gehört mir. Ich kann sie ändern, löschen usw.
  796.  * (Protected) - die Flags WriteAccess, ReadAccess, ViewAccess, Owner zusammen-
  797.  *               geORt. When writing global- or user-flags, you  are  not  allowed  to
  798.  *                manipulate all possible flags. Protected Flags sind PRIVATE!
  799.  *
  800.  *
  801.  * UMSSet      LoginStatus   -- 16 Bits (von Bit 0 bis Bit 15) zu Deiner freien
  802.  *                              Verfügung. Werden im ums.doc auch als Local-Flags
  803.  *                              bezeichnet. Bedeutet aber das gleiche wie Login.
  804.  *
  805.  * Diese LoginFlags kommen bei
  806.  * UMSSelect() und UMSSearch() zur Anwendung.
  807.  * Vor Gebrauch: mit UMSSelect zurücksetzen.
  808.  * --------------------------------------------------------------------------
  809.  * Ende StatusFlags. Weiter mit restlichen MessageInfo-Feldern:
  810.  *
  811.  * Für Crosspostings
  812.  * -----------------
  813.  * UMSMsgNum   HardLink
  814.  * UMSMsgNum   SoftLink
  815.  *
  816.  */
  817. struct MessageInfo myMessageInfo;
  818.  
  819. /* ==================================================
  820.  * UMSMsgTextFields
  821.  * ==================================================
  822.  * Globaler Zeiger auf Messagefields. Siehe ums.h für die vorgesehenen
  823.  * Feldinhalte. Beispiel: myFields[0] zeigt auf den Message-Body.
  824.  * Wobei die Zahl "0" für UMSCODE_MsgText steht. Zweites Bespiel: Mit
  825.  * myFields[ UMSCODE_FromName ] kommt man an den Absendernamen usw.
  826.  *
  827.  * Nullzeiger:
  828.  * Wenn myFields [ UMSCODE_............ ] = NULL, ist der
  829.  * Eintrag entweder nicht eingelesen, nicht verfügbar oder
  830.  * es gab einen Fehler beim Lesen.
  831.  *
  832.  * 3. Beispiel:
  833.  *
  834.  * printf("Diese Message kommt von:  %s .\n", myFields[ UMSCODE_FromName ] ?
  835.  *         myFields[ UMSCODE_FromName ] : "-- kein Name vorhanden!\n"  );
  836.  *
  837.  * ergibt:
  838.  *        "Diese Message kommt von:  Stefan Müller"
  839.  *
  840.  * oder:
  841.  *        "Diese Message kommt von:  -- kein Name vorhanden!"
  842.  *
  843.  * Es gibt insgesamt über 40 dieser UMSCODE-message array index definitions
  844.  * (siehe "ums.doc/--message-format--" und das Includefile ums.h.)
  845.  *
  846.  * Warnung:
  847.  * Die mit UMSReadMsg() gelesenen Daten müssen nach Gebrauch wieder
  848.  * freigegeben werden (1 x UMSFreeMsg() ). Die Feldinhalte sind READ-ONLY.
  849.  * Verboten: überschreiben, ändern.
  850.  * (todo)
  851.  */
  852. UMSMsgTextFields myFields;
  853.  
  854. /* Zeiger auf Users Realname. Wird nach UMSRLogin() aus der UMS-Konfiguration gelesen. */
  855. /* todo: checken ob FreeConfig? */
  856. STRPTR realname;
  857.  
  858. /* --------- List-Kludges ------------- */
  859.  
  860. /*
  861.  * MyNodes -- (vorläufiger) Listnode für die Message- und Gruppenlisten
  862.  *
  863.  *  struct Node node  -- Standard-Exec-ListNode mit Name, Pri und Type
  864.  *  UMSMsgNum num     -- Speicher für die Messagenummer (für GlobMsgList)
  865.  *  STRPTR text       -- Speicher für Eintrag in Listview (MyNodes.node.ln_Name =UMS-Intern) (todo)
  866.  */
  867. struct MyNodes
  868.   {
  869.     struct Node node;        // Eine Node-Struktur
  870.  
  871.     UMSMsgNum num;
  872.     STRPTR text;        /* interner Text */
  873.   };
  874.  
  875. /* Typ name_nodes... */
  876. #define NAME_NODE   200
  877.  
  878.  
  879. /* Messagedaten in Newsbreaker.
  880.  * ============================
  881.  *
  882.  * Leider wird von ums.library etc. kein allgemeines Format angeboten,
  883.  * in dem Applikationen Nachrichten- und Gruppenlisten speichern
  884.  * und verwalten können.
  885.  *
  886.  * Deshalb hier die (vorläufige) Implementierung der Message- und
  887.  * Gruppenverwaltung in NewsBreaker:
  888.  *
  889.  * Zur Zeit werden hier UMS-Messages in zwei unterschiedlichen Exec-Lists
  890.  * gespeichert:
  891.  *
  892.  * 1. in einer globalen GRUPPEN-Liste
  893.  * 2. in einer globalen MESSAGE- oder Nachrichten-Liste
  894.  *
  895.  * Dazu:
  896.  *
  897.  * 1. (List *) GlobGroupList
  898.  *
  899.  *   verwaltet eine Liste der zugänglichen Gruppen. Die Globale
  900.  *   Gruppen Liste wird mit MakeGroupList() erzeugt. [ Zur Zeit
  901.  *   wird hier noch über die globale Variable "GlobalFocus" gefiltert,
  902.  *   ob alle vorhandenen Gruppen oder nur Gruppen mit neuen
  903.  *   Nachrichten in die Liste aufgenommen werden (kludge) ].
  904.  *
  905.  *   Ein Node der GlobGroupList enthält (zur Zeit) im ln_Name-Feld einen
  906.  *   STRPTR auf den Gruppennamen. Diese Info wird in anderen
  907.  *   Routinen (z.B. Gadtools ListView-Handling) ausgelesen.
  908.  *
  909.  *   [ Hinweis: Es ist schon in der Nodestruktur (siehe Globals.h)
  910.  *   ein weiteres STRPTR-Feld vorbereitet um zwischen internem UMS-Gruppenname
  911.  *   und ListView-Darstellung der Gruppe zu unterscheiden. -todo.]
  912.  *
  913.  *
  914.  *   2. (List *) GlobMsgList
  915.  *
  916.  *   verwaltet eine Liste der wählbaren Messages. Die Globale Message
  917.  *   Liste wird mit MakeMsgList() erzeugt. Hier wird der "Focus", also
  918.  *   die Beschränkung auf bestimmte Nachrichten (alle neuen, alle, ...)
  919.  *   schon im Aufruf von MakeMsgList () übergeben.
  920.  *
  921.  *   Ein Node der GlobMsgList enthält neben einem STRPTR für die ListView-
  922.  *   Darstellung die (eindeutige) UMS-Message-Nummer. Diese UMS-Message-Nummer
  923.  *   wird aus dem Node ausgelesen:
  924.  *   wenn User in einem ListView den entsprechenden Eintrag anklickt.
  925.  *
  926.  *   Allgemeines zu den globalen Listen:
  927.  *
  928.  *   - Dieses Konzept wird weiter optimiert. Siehe auch die Kommentare
  929.  *     in den Funktionen.
  930.  *   - GlobGroupList und GlobMsgList werden über die Funktionen
  931.  *     in <Lists.c> verwaltet. Hier sollten noch speziellere Fallunter-
  932.  *     scheidungen getroffen werden (todo)
  933.  *   - Hinweis: Zu beiden globalen Listen gehören weitere globale Variablen.
  934.  *     Diese werden unten behandelt.
  935.  */
  936. struct List *GlobGroupList = NULL;    /* Pointer auf globalen Listheader */
  937. struct List *GlobMsgList = NULL;    /* Pointer auf globalen Listheader */
  938.  
  939. /* GlobMsgGroup : wenn nicht NULL, dann ist STRPTR der Name einer Gruppe.
  940.    Diese Gruppe ist mit GlobMsgList verbunden. AktMsgGroup kann gleich
  941.    GlobMsgGroup sein, muß aber nicht. */
  942.  
  943. STRPTR GlobMsgGroup = NULL;    /* Message-Liste hat Nodes aus Gruppe "GlobMsgGroup" */
  944. STRPTR AktMsgGroup = NULL;    /* User wählt Gruppe AktMsgGroup */
  945.  
  946. UMSMsgNum GlobMsgNum = 0;    /* Globale MsgNum in NewsBreaker */
  947. UMSMsgNum tempNum = 0;        /* temporäre Messagenummer für einige Routinen (kludge) */
  948.  
  949. /*----------------------------------------------------------*/
  950.  
  951. /* Ich versuche, globale Variablen in einer Struktur zusammenzufassen: */
  952. /* Dies ist z.Zt. nicht implementiert: */
  953.  
  954. struct NBInfo            /*todo */
  955.   {
  956.     struct Gadget *txt;
  957.     struct Window *win;
  958.     UMSUserAccount acc;
  959.   };
  960.  
  961. /*----------------------------------------------------*/
  962. /* WriteMsg */
  963.  
  964. /* Messagetypen für WriteMsg(): *//* todo --> globals.h */
  965. enum
  966.   {
  967.     EMAIL, POSTING, REPLY, FOLLOWUP
  968.   };
  969.  
  970. /* dazu passende Strings... */
  971. STRPTR msgtypename[] = { "EMail", "Posting", "Reply", "FollowUp" };
  972. STRPTR msgtypeaction[] =
  973.     {
  974.     "Private E-Mail schreiben",
  975.     "Öffentliches Posting schreiben",
  976.     "Reply auf Nachricht schreiben",
  977.     "FollowUp auf Nachricht schreiben"
  978.     };
  979.  
  980.  
  981. /*******/
  982. /* DBG */
  983. /*******/
  984.  
  985. /* ShowGlobals Level-Parameter */
  986. #define SG_FULL  0L     /* alles zeigen */
  987. #define SG_SHORT 1L     /* nur das Wichtigste */
  988. #define SG_MEMORY 2L    /* nur Speicher */
  989. #define SG_UMS 3L    /* nur UMS */
  990.  
  991. /*--------------------------*/
  992.  
  993. /* todo: global und lokal */
  994. /* Bezeichnung der UMS_Fields */
  995.  
  996. static char *ums_field[] =
  997. {
  998.   "MsgText",            // 0
  999.    "FromName",            // 1
  1000.    "FromAddr",            // 2
  1001.    "ToName",            // 3
  1002.    "ToAddr",            // 4
  1003.    "MsgID",            // 5
  1004.    "CreationDate",        // 6
  1005.    "ReceiveDate",        // 7
  1006.    "ReferID",            // 8
  1007.    "Group",            // 9
  1008.    "Subject",            //10
  1009.    "Attributes",        //11
  1010.    "Comments",            //12
  1011.    "Organization",        //13
  1012.    "Distribution",        //14
  1013.    "Folder",            //15
  1014.    "FidoID",            //16
  1015.    "MausID",            //17
  1016.    "ReplyGroup",        //18
  1017.    "ReplyName",            //19
  1018.    "ReplyAddr",            //20
  1019.    "LogicalToName",        //21
  1020.    "LogicalToAddr",        //22
  1021.    "FileName",            //23
  1022.    "RFCMsgNum",            //24
  1023.    "?",                //25
  1024.    "?",                //26
  1025.    "?",                //27
  1026.    "?",                //28
  1027.    "?",                //29
  1028.    "?",                //30
  1029.    "?",                //31
  1030.    "FidoText",            //32
  1031.    "ErrorText",            //33
  1032.    "Newsreader",        //34
  1033.    "RfcAttribut",        //35
  1034.    "FtnAttribut",        //36
  1035.    "ZerAttribut",        //37
  1036.    "MausAttribut",        //38
  1037.    "?",                //39
  1038.    "?"};
  1039.  
  1040.  
  1041. static char *ums_messageinfos[] =
  1042. {
  1043.   "HeaderLength",
  1044.   "TextLength",
  1045.   "Date",
  1046.   "ChainUp",
  1047.   "ChainDn",
  1048.   "ChainLt",
  1049.   "ChainRt",
  1050.   "GlobalStatus",
  1051.   "UserStatus",
  1052.   "LoginStatus",
  1053.   "HardLink",
  1054.   "SoftLink",
  1055.   "CDate"};
  1056.  
  1057. /* Global Flag Names */
  1058.  
  1059. static char *ums_globalflags[] =
  1060. {
  1061.   "Deleted ",
  1062.   "Expired ",
  1063.   "Exported ",
  1064.   "Orphan ",
  1065.   "Link ",
  1066.   "Hardlink ",
  1067.   "Parked ",
  1068.   "HasFile "};
  1069.  
  1070. /* User Flag Names */
  1071.  
  1072. static char *ums_userflags[] =
  1073. {
  1074.   "Archive ",
  1075.   "Junk ",
  1076.   "PostPoned ",
  1077.   "Selected ",
  1078.   "Filtered ",
  1079.   "Old ",
  1080.   "WriteAccess ",
  1081.   "ReadAccess ",
  1082.   "ViewAccess ",
  1083.   "Owner "};
  1084.